package com.powernode.controller;

import com.powernode.common.Result;
import com.powernode.common.UploadBean;
import com.powernode.domain.User;
import com.powernode.service.UserService;
import com.powernode.utils.WebMvcUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.util.UUID;

@RestController
@RequestMapping("file")
@Api(tags = "传输头像图片的接口")
public class FileController {
    @Resource
    private UserService userService;

    @Resource
    private UploadBean uploadBean;

    @RequestMapping("uploadImg.do")
    @ApiOperation("上传图片")
    public Result uploadImg(MultipartFile mf) {
        String oldName = mf.getOriginalFilename();
        String newName = createNewFileName(oldName);
        try {
            mf.transferTo(new File(uploadBean.getUploadPath() + newName));
            User user = new User();
            user.setId(WebMvcUtils.getCurrentUser().getId());
            user.setImg(newName);
            userService.updateByPrimaryKeySelective(user);
            String fullPath = uploadBean.getBaseURL() + newName;
            return new Result(0, "上传成功", 0L, fullPath);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.OPT_ERROR;
        }
    }

    /**
     *文件下载的方法
     * @return
     */
    @RequestMapping("download.do")
    @ApiOperation("下载图片")
    public ResponseEntity download(String path) throws Exception {
        File file = new File(uploadBean.getUploadPath(),path);//本地磁盘文件
        if(!file.exists()){
            return null;
        }
        //使用输入流  将文件读入内存中
        FileInputStream fis = new FileInputStream(file); // 找参照物   将程序运行的内存当做参照物
        //文件的大小
        long length = file.length();
        //创建一个和文件一样大小的字节数组  一次性将数据读入到内存中  如果文件量过大，请求比较频繁 存在 崩溃的风险
        byte[] fileByte = new byte[(int) length];//一个G 的   byte 数组  64 G    65个人下载   1分钟
        //一次性将文件数据读入到数组中
        fis.read(fileByte);
        // springmvc 中封装的 响应实体 ：
        //设置响应码
        //设置响应的数据头信息
        //设置响应数据
        HttpHeaders headers = new HttpHeaders(); //响应头信息
        //设置响应的数据为流数据  告诉浏览器 不要解析
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //设置下载的文件的名称  中文字符串要进行编码
        headers.setContentDispositionFormData("filename","1.jpg");
        return new ResponseEntity(fileByte,headers, HttpStatus.OK);
    }

    private String createNewFileName(String oldName) {
        String substring = oldName.substring(oldName.lastIndexOf("."));
        return UUID.randomUUID().toString().replace("-", "").toUpperCase() + substring;
    }
}
